const path = require('path');
// 压缩css并提取文件
const miniCssExtractPlugin = require('mini-css-extract-plugin');
// 把资源插入到html
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 打包清除dist
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
// 配合vue-loader的plugin
const { VueLoaderPlugin } = require('vue-loader')
// 看每个loader的打包速度
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");
const smp = new SpeedMeasurePlugin();

const HappyPack = require('happypack');



const webpackConfig = {
  // JavaScript 执行入口文件
  mode: 'development',
  entry: './webpack/react/main.jsx',
  output: {
    // 把所有依赖的模块合并输出到一个 bundle.js 文件
    filename: '[name]_[chunkhash:8].js',
    // 输出文件都放到 dist 目录下
    path: path.join(__dirname, './webpack/dist'),
    publicPath: ''
  },
  resolve: {
    alias: {
      '@': './src/components/'
    },
    // enforceExtension: true,  //开启后导入语句必须要文件后缀
    modules: ['./webpack/component/common', 'node_modules'], //寻找第三方模块的寻找规则
    extensions: ['.ts', '.js', '.jsx']
  },
  devtool: 'source-map',
  module: {
    rules: [
      {
        // 用正则去匹配要用该 loader 转换的 CSS 文件
        test: /\.css$/,
        use: [
          miniCssExtractPlugin.loader,
          // {
          //   loader: 'css-loader',
          //   options: {
          //     url: false
          //   }
          // },
          'happypack/loader?id=css',
          { loader: 'postcss-loader' }

        ]
      },
      {
        test: /\.jpeg$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // 30KB 以下的文件采用 url-loader
              limit: 1024 * 40,
              // 否则采用 file-loader，默认值就是 file-loader 
              fallback: 'file-loader',
            }
          }
        ]
      },
      // 转es5
      {
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ['@babel/preset-env']
          }
        }
      },
      // 转ts
      {
        test: /\.ts$/,
        use: [
          'babel-loader',
          'awesome-typescript-loader'
        ]
        // loader: 'awesome-typescript-loader'
      },
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
        },
      },
      {
        test: /\.vue$/,
        use: ['vue-loader'],
      },
    ]
  },
  plugins: [
    new miniCssExtractPlugin({
      // 从 .js 文件中提取出来的 .css 文件的名称
      filename: `[name]_[contenthash:8].css`,
    }),
    // 把打包文件写入html
    new HtmlWebpackPlugin({
      template: path.join(__dirname, './webpack/index.html'),
      filename: 'index.html',
      hash: true,//true则将唯一的webpack编译哈希值附加到所有包含的脚本和CSS文件中。主要用于清除缓存,同时需要将output中的filename设置成bundle.[hash].js
    }),
    // 打包前清空dist
    new CleanWebpackPlugin(),
    // require('postcss-cssnext')
    //vue
    new VueLoaderPlugin(),
    new HappyPack({
      id: 'css',
      // 如何处理 .css 文件，用法和 Loader 配置中一样
      loaders: ['css-loader'],
    }),
  ],
  // target: 'web',
  devServer: {
    static: './webpack/dist',
    compress: true,
    port: 9000,
    // https: true,
    hot: true,  //开启热更新
    headers: {
      'X-foo': 'bar'
    }
  },
};

module.exports = smp.wrap(webpackConfig);
